package com.cn.qtms.common.jdbc;//类注释设置模板

import com.cn.qtms.exception.AppException;
import org.apache.commons.lang3.StringUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Map;


/**
 * @Name:CRUDTemplate 增删改查工具类
 * @Description:
 * @Author: zhangyang
 * @Date: 2019-10-21 17:38
 **/
public class CrudTemplate {
    /**
     * 增删改操作
     * @param sql 传入的SQL语句
     * @param params 可变参数
     * @return 操作结果
     */
    public static int executeUpdate(String sql,Object... params){
        Connection conn = null;
        PreparedStatement psmt = null;
        int result = 0;
        try {
            //获取数据库连接对象
            conn = JdbcUtil.getConn();
            //获取预编译语句对象
            psmt = conn.prepareStatement(sql);
            //给预编译语句赋值
            for (int i = 0; i < params.length; i++) {
                psmt.setObject(i+1,params[i]);
            }
            //执行SQL语句获取执行结果
            result = psmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //关闭数据库连接
            JdbcUtil.close(conn,psmt,null);
        }
        return result;
    }

    /**
     * 增删改操作 需要传入数据库连接信息
     * @param sql 传入的SQL语句
     * @param params 可变参数
     * @return 操作结果
     */
    public static int executeUpdate(String sql,Map<String,String> map, Object... params){
        Connection conn = null;
        PreparedStatement psmt = null;
        //获取数据库连接信息
        final String url = map.get("url");
        final String username = map.get("username");
        final String password = map.get("password");
        if(StringUtils.isAnyBlank(new String[]{url,username,password})){
            throw new AppException("数据库连接参数不能为空");
        }
        int result = 0;
        try {
            //获取数据库连接对象
            conn = JdbcUtil.getConn(url,username,password);
            //获取预编译语句对象
            psmt = conn.prepareStatement(sql);
            //给预编译语句赋值
            for (int i = 0; i < params.length; i++) {
                psmt.setObject(i+1,params[i]);
            }
            //执行SQL语句获取执行结果
            result = psmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //关闭数据库连接
            JdbcUtil.close(conn,psmt,null);
        }
        return result;
    }


    /**
     * 查询操作
     * @param sql SQL语句
     * @param handler 判断查询一个还是多个
     * @param params 可变参数
     * @param <T> 具体操作的实体类
     * @return 返回IResultSetHandler接口中的泛型
     */
    public static <T> T executeQuery(String sql, IResultSetHandler<T> handler,Object... params){
        Connection conn = null;
        PreparedStatement psmt = null;
        ResultSet rs = null;
        try {
            //获取数据库连接对象
            conn = JdbcUtil.getConn();
            //获取预编译语句对象
            psmt = conn.prepareStatement(sql);
            //给预编译语句赋值
            for (int i = 0; i < params.length; i++) {
                psmt.setObject(i+1,params[i]);
            }
            //执行SQL语句获取结果集
            rs = psmt.executeQuery();
            //处理结果集
            return handler.handle(rs);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //关闭数据库连接
            JdbcUtil.close(conn,psmt,rs);
        }
        return null;
    }

    /**
     * 查询操作 需要传入数据库连接信息
     * @param sql SQL语句
     * @param handler 判断查询一个还是多个
     * @param params 可变参数
     * @param <T> 具体操作的实体类
     * @return 返回IResultSetHandler接口中的泛型
     */
    public static <T> T executeQuery(String sql,Map<String,String> map, IResultSetHandler<T> handler,Object... params){
        Connection conn = null;
        PreparedStatement psmt = null;
        ResultSet rs = null;
        //获取数据库连接信息
        final String url = map.get("url");
        final String username = map.get("username");
        final String password = map.get("password");
        if(StringUtils.isAnyBlank(new String[]{url,username,password})){
            throw new AppException("请输入数据库连接参数");
        }
        try {
            //获取数据库连接对象
            conn = JdbcUtil.getConn(url,username,password);
            //获取预编译语句对象
            psmt = conn.prepareStatement(sql);
            //给预编译语句赋值
            for (int i = 0; i < params.length; i++) {
                psmt.setObject(i+1,params[i]);
            }
            //执行SQL语句获取结果集
            rs = psmt.executeQuery();
            //处理结果集
            return handler.handle(rs);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //关闭数据库连接
            JdbcUtil.close(conn,psmt,rs);
        }
        return null;
    }
}

